/**
 ****************************************************************************************************
 * @file        key.c
 * @author      嵌入式小书虫
 * @version     V1.0
 * @date        2020-04-17
 * @brief       key 驱动代码
 ****************************************************************************************************
 *
 * 修改说明
 * V1.0 20200417
 * 第一次发布
 <欢迎关注微信公众号：嵌入式小书虫>
 *
 ****************************************************************************************************
 */

#include "./BSP/key.h"



static GPIO_InitTypeDef gpio_key_init_struct;

void TM1688_GPIO_init(){
		
	
		__HAL_RCC_GPIOE_CLK_ENABLE();                                /* 时钟使能 */
	
		gpio_key_init_struct.Pin = TM1668_CLK_GPIO_PIN;             /* 引脚 */
    gpio_key_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
    gpio_key_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_key_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    HAL_GPIO_Init(TM1668_CLK_GPIO_PORT, &gpio_key_init_struct); /* 初始化引脚 */
	
		gpio_key_init_struct.Pin = TM1668_SDA_GPIO_PIN;             /* 引脚 */
		HAL_GPIO_Init(TM1668_SDA_GPIO_PORT, &gpio_key_init_struct); /* 初始化引脚 */
	
		gpio_key_init_struct.Pin = TM1668_STB_GPIO_PIN;             /* 引脚 */
		HAL_GPIO_Init(TM1668_STB_GPIO_PORT, &gpio_key_init_struct); /* 初始化引脚 */

}

void SDA_OUT(){
		gpio_key_init_struct.Pin = TM1668_SDA_GPIO_PIN;             /* 引脚 */
		gpio_key_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
		HAL_GPIO_Init(TM1668_SDA_GPIO_PORT, &gpio_key_init_struct); /* 初始化引脚 */
}
void SDA_IN(){
		gpio_key_init_struct.Pin = TM1668_SDA_GPIO_PIN;             /* 引脚 */
		gpio_key_init_struct.Mode = GPIO_MODE_INPUT;            /* 推挽输出 */
		HAL_GPIO_Init(TM1668_SDA_GPIO_PORT, &gpio_key_init_struct); /* 初始化引脚 */
}

//发送一个字节
void TM1668_Write(uint8_t DATA)
{
	unsigned char i;
	SDA_OUT(); 
	delay_us(2); 
	for(i=0;i<8;i++)
	{
		TM1668_CLK_LOW;//TM1668_CLK=0;
		delay_us(2); 
		if(DATA&0X01){
			TM1668_SDA_HIGH;//OUT_SDA=1;
		}else{
			TM1668_SDA_LOW;//OUT_SDA=0;
		}
		delay_us(2); 
		DATA>>=1;
		TM1668_CLK_HIGH;//TM1668_CLK=1;
		delay_us(2); 
	}
}

//读字节
uint8_t TM1668_Read(void)
{
	unsigned char i;
	unsigned char temp=0;

	SDA_IN();//SDA设置为输入
	delay_us(2); 
	for(i=0;i<8;i++)
	{
		temp>>=1;
		TM1668_CLK_LOW;//TM1668_CLK=0;
		delay_us(2); 
		if(READ_SDA)
			temp|=0x80;
		TM1668_CLK_HIGH;//TM1668_CLK=1;
		delay_us(2); 
	}
	return temp;
}

void Write_COM(unsigned char cmd)		//发送命令字
{
	TM1668_STB_LOW;//TM1668_STB=0;
	TM1668_Write(cmd);
	TM1668_STB_HIGH;//TM1668_STB=1;
}

void Write_DATA(unsigned char add,unsigned char DATA)		//指定地址写入数据
{
	TM1668_STB_LOW;//TM1668_STB=0;
	TM1668_Write(0xc0|add); //1100 0000 
	TM1668_Write(DATA);
	TM1668_STB_HIGH;//TM1668_STB=1;
}
//#include "arm_2d_helper.h"
uint8_t Read_key(void)  //读按键
{
	unsigned char c[5] = {0,0,0,0,0},i,key_value=0;
	TM1668_STB_LOW;//TM1668_STB=0;
	delay_us(2);
	//arm_irq_safe {
			TM1668_Write(0x42);		  //读键扫数据 命令
			for(i=0;i<5;i++)
				{	
					c[i]=TM1668_Read();
				}
	//}
	TM1668_STB_HIGH;//TM1668_STB=1;					           //4个字节数据合成一个字节
	
	/* 20 按键检测 */
	if(c[0] != 0)
		{
			if(c[0]==0x01)
				{
					key_value = 16; //预留 4 功能键
				}
			else if(c[0]==0x02)
				{
					key_value=15; //预留 3 功能键
				}
			else if(c[0]==0x10)
				{
					key_value = 3; //按键 3
				}
			else if(c[0]==0x08)
				{
					key_value = 17; //上锁键
				}
//			LCD_ShowxNum(200,10,key_value,2,RED,BLUE);
//			delay_ms(50);
			return key_value;
		}
	if(c[1] != 0)
		{
			if(c[1]==0x01)
				{
					key_value = 18; //清除
				}
			else if(c[1]==0x02)
				{
					key_value = 6; // 6
				}
			else if(c[1]==0x08)
				{
					key_value = 19; //左移
				}
			else if(c[1]==0x10)
				{
					key_value = 9; //9
				}
//			LCD_ShowxNum(200,10,key_value,2,RED,BLUE);
//			delay_ms(50);
			return key_value;
		}
	if(c[2] != 0)
		{
			if(c[2]==0x01)
				{
					key_value = 20; //OK
				}
			else if(c[2]==0x02)
				{
					key_value = 12; //#
				}
			else if(c[2]==0x08)
				{
					key_value = 2; //2
				}
			else if(c[2]==0x10)
				{
					key_value = 1; //1
				}
//			LCD_ShowxNum(200,10,key_value,2,RED,BLUE);
//			delay_ms(50);
			return key_value;
		}
	if(c[3] != 0)
		{
			if(c[3]==0x01)
				{
					key_value = 14; //预留 2 功能键
				}
			else if(c[3]==0x02)
				{
					key_value = 13; //预留 1 功能键
				}
			else if(c[3]==0x08)
				{
					key_value = 5; //5
				}
			else if(c[3]==0x10)
				{
					key_value = 4; //4
				}
//			LCD_ShowxNum(200,10,key_value,2,RED,BLUE);
//			delay_ms(50);
			return key_value;
		}
	if(c[4] != 0)
		{
			if(c[4]==0x01)
				{
					key_value = 8; //8
				}
			else if(c[4]==0x02)
				{
					key_value = 7; //7
				}
			else if(c[4]==0x08)
				{
					key_value = 11; //0
				}
			else if(c[4]==0x10)
				{
					key_value = 10; //*
				}
			//LCD_ShowxNum(200,10,key_value,2,RED,BLUE);
			//delay_ms(50);
			return key_value;
		}
	return 0;
}

uint8_t KEY_Scan(uint8_t mode)
{	 
	static uint8_t key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(Read_key() != 0))
	{
		//delay_ms(20);//去抖动 
		key_up=0;
		if(Read_key() != 0)return Read_key();
	}else if(Read_key()==0)key_up=1; 	    
 	return 0;// 无按键按下
}
